import 'reflect-metadata'

/**
 * 控制器配置
 */
interface ControllerOptions {
  prefix?: string
}

/**
 * 工厂 返回一个类装饰器\
 * 接收一个可选的路径前缀\
 */
export function Controller (): ClassDecorator // 没有路径前缀情况
export function Controller (prefix?: string): ClassDecorator // 有路径前缀情况
export function Controller (options?: ControllerOptions): ClassDecorator // 有控制器配置情况
export function Controller (prefixOrOptions?: string | ControllerOptions): ClassDecorator {
  let options: ControllerOptions = {}
  // 处理不同情况的路由前缀 
  if (typeof prefixOrOptions === 'string') {
    options.prefix = prefixOrOptions
  } else if (typeof prefixOrOptions === 'object') {
    options = prefixOrOptions
  }
  /**
   * 类装饰器 target 是类本身 \
   * 用于标识一个类是控制器类
   */
  return (target: Function) => {
    // 给控制器类添加 prefix 路径前缀的元数据
    Reflect.defineMetadata('prefix', options.prefix || '', target)
  }
}

/**
 * prefix 元数据可能取值
 * '' 空字符串
 * '/' 根路径
 * 'abc' 任何字符路径
 * '/abc' 任何字符路径
 * 
 * 在生成HTTP请求路径时 path.posix.join 调用时 传递的第一个参数永远都是 '/'
 * path.posix.join 可以将
 * path.posix.join('/', '/') 转换成 '/'
 * path.posix.join('/', '/abc') 转换成 '/abc'
 * path.posix.join('/', 'abc') 转换成 '/abc'
 * path.posix.join('/', '/', 'abc') 转换成 '/abc'
 * path.posix.join('/', '/', '/abc') 转换成 '/abc'
 * path.posix.join('/', ':id') 转换成 '/:id'
 * path.posix.join('/cat', ':id') 转换成 '/cat/:id'
 * path.posix.join('/cat', '/:id') 转换成 '/cat/:id'
 * path.posix.join('/cat////', '/:id///') 转换成 '/cat/:id/'
 */
